package com.agentframework.examples.jinhua;

import com.agentframework.core.annotation.Action;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;

import java.util.List;
import java.util.Set;

import static com.agentframework.core.agent.Agent.*;

/**
 * 查看手牌动作，处理玩家查看手牌的请求
 * @author wangjun
 */
@Action(name = "view_cards")
public class ViewCardsAction extends JinhuaDealerAction {
    
    public ViewCardsAction(JinhuaTool jinhuaTool) {
        super("view_cards", jinhuaTool);
    }
    
    @Override
    protected String getFormatInstruction() {
        return """
                你需要处理玩家的看牌请求，请必须且只能返回如下JSON格式：
                {
                    "playerId": "玩家ID",
                    "cards": ["玩家手牌"],
                    "message": "确认玩家已看牌的消息"
                }
                            
                正确示范：
                {
                    "playerId": "player-1",
                    "cards": ["♠A", "♥K", "♦Q"],
                    "message": "玩家player-1已看牌"
                }
                            
                特别注意：
                    -你必须使用viewCards工具查看玩家手牌，参数为玩家ID，你不能直接把举例说明的json返回
                    -你需要做出解析的内容，必须包含在返回的json格式的message字段内，严禁放到json结构之外
                """;
    }

    @Override
    protected void doHandleResponseMessage(Message message, Object response) {
        ViewCardResp viewCardResp = (ViewCardResp) response;
        String playerId = viewCardResp.playerId();
        String messageContent = viewCardResp.message();

        // 广播所有人已看牌，包括荷官
        Message viewCardsMessage = new UserMessage(messageContent);
        viewCardsMessage.getMetadata().put(SEND_TO, Set.of(TO_ALL));
        viewCardsMessage.getMetadata().put(VIEW_TO, Set.of(TO_ALL));
        publishMessage(viewCardsMessage);

        // 通知玩家继续行动
        Message nextMessage = new UserMessage(playerId + "，已看牌，请继续说话");
        nextMessage.getMetadata().put(SEND_TO, Set.of(playerId));
        publishMessage(nextMessage);
    }

    @Override
    protected Class<?> getResponseType() {
        return ViewCardResp.class;
    }

    record ViewCardResp(String playerId, List<String> cards, String message) {

    }

} 